news 2026/1/16 10:27:44

Python之PDF小工具

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python之PDF小工具

Python之PDF小工具

【穷鬼套餐(买不起WPS会员)】这是一个多功能工具,既可以将EPUB电子书转换为PDF格式,也可以对现有的PDF文件进行拆分。

1-epub_to_pdf

#!/usr/bin/env python3""" epub_to_pdf.py ebooklib>=0.20、weasyprint>=66.0 实测通过 """importosimportsysimportebooklibfromebooklibimportepubfromweasyprintimportHTMLfromweasyprint.text.fontsimportFontConfigurationdefconvert_epub_to_pdf(src_epub:str,dst_pdf:str|None=None)->str|None:"""把单个 epub 转 pdf,返回输出文件路径;失败返回 None"""try:book=epub.read_epub(src_epub)html_parts=[]foriteminbook.get_items():ifitem.get_type()==ebooklib.ITEM_DOCUMENT:html_parts.append(item.get_content().decode('utf-8',errors='ignore'))ifnothtml_parts:raiseValueError('文档不包含可解析章节')# 拼成完整 HTMLfull_html=f""" <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <style> body {{ font-family: "PingFang SC", "Helvetica Neue", "Arial", sans-serif; line-height: 1.6; }} </style> </head> <body>{''.join(html_parts)}</body> </html> """ifdst_pdfisNone:out_dir=os.path.join('.','pdf')os.makedirs(out_dir,exist_ok=True)title=os.path.splitext(os.path.basename(src_epub))[0]dst_pdf=os.path.join(out_dir,f"{title}.pdf")HTML(string=full_html).write_pdf(dst_pdf,font_config=FontConfiguration())print(f"✅ 成功:{dst_pdf}")returndst_pdfexceptExceptionase:print(f"❌ 失败:{src_epub}\n原因:{e}")returnNonedefmain(target):ifos.path.isfile(target)andtarget.lower().endswith('.epub'):convert_epub_to_pdf(target)elifos.path.isdir(target):epub_files=[fforfinos.listdir(target)iff.lower().endswith('.epub')]ifnotepub_files:print('📂 该目录下没有 epub 文件')returnforfinepub_files:convert_epub_to_pdf(os.path.join(target,f))# ----------------------------# 脚本入口# ----------------------------if__name__=='__main__':# if len(sys.argv) != 2:# print('用法:python epub_to_pdf.py <epub文件或文件夹路径>')# sys.exit(1)## target = sys.argv[1]main("/Users/rong/Documents/09-深度学习/epub_book")

2-epub_to_pdf

#!/usr/bin/env python3""" epub_to_pdf.py ebooklib>=0.20、weasyprint>=66.0 实测通过 """importsysimportos# 添加PyPDF2库用于PDF操作try:importPyPDF2 PDF_LIBRARY_AVAILABLE=TrueexceptImportError:PyPDF2=NonePDF_LIBRARY_AVAILABLE=Falsedefsplit_pdf(input_pdf_path:str,output_pdf_path:str,pdf_file_name:str,start_page:int,end_page:int)->bool:"""按指定页码范围拆分PDF文件"""ifnotPDF_LIBRARY_AVAILABLE:print("❌ 错误:缺少PyPDF2库,请安装PyPDF2")returnFalsetry:withopen(input_pdf_path+pdf_file_name,'rb')asinfile:reader=PyPDF2.PdfReader(infile)writer=PyPDF2.PdfWriter()# 检查页码范围是否有效total_pages=len(reader.pages)ifstart_page<1orend_page>total_pagesorstart_page>end_page:print(f"❌ 错误:页码范围无效。总页数:{total_pages},请求范围:{start_page}-{end_page}")returnFalse# 提取指定页面foriinrange(start_page-1,end_page):# 页码从0开始索引writer.add_page(reader.pages[i])# 确保输出目录存在os.makedirs(output_pdf_path,exist_ok=True)# 写入新文件output_file_name=output_pdf_path+str(start_page)+"_"+str(end_page)+"_"+pdf_file_namewithopen(output_file_name,'wb')asoutfile:writer.write(outfile)print(f"✅ 成功拆分PDF:{input_pdf_path}的第{start_page}-{end_page}页已保存到{output_file_name}")returnTrueexceptExceptionase:print(f"❌ 拆分PDF失败:{e}")returnFalsedefmain(pdf_file):split_pdf(pdf_file,"output.pdf",1,10)# ----------------------------# 脚本入口# ----------------------------if__name__=='__main__':input_pdf_path="./pdf/"output_pdf_path="./pdf_split/"input_pdf_name="曾国藩传_张宏杰.pdf"success=split_pdf(input_pdf_path,output_pdf_path,input_pdf_name,1,115)success=split_pdf(input_pdf_path,output_pdf_path,input_pdf_name,115,206)success=split_pdf(input_pdf_path,output_pdf_path,input_pdf_name,206,338)sys.exit(0ifsuccesselse1)

3-项目说明

功能特性

  1. EPUB转PDF转换器
  2. PDF文件按页码范围拆分

安装依赖

pipinstall-r requirements.txt

或者使用uv:

uv pipinstall-r.

使用方法

EPUB转PDF

python main.py<epub文件或文件夹路径>

示例:

# 转换单个EPUB文件python main.py books/example.epub# 转换目录下的所有EPUB文件python main.py books/

拆分PDF文件

python main.pysplit<输入PDF文件><输出PDF文件><起始页码><结束页码>

示例:

# 拆分PDF的第5页到第10页python main.pysplitinput.pdf output.pdf510

依赖库

  • ebooklib: 处理EPUB文件
  • weasyprint: 将HTML转换为PDF
  • PyPDF2: 操作PDF文件
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/14 21:06:42

Parsec VDD虚拟显示器:解锁无限屏幕空间的终极方案

Parsec VDD虚拟显示器&#xff1a;解锁无限屏幕空间的终极方案 【免费下载链接】parsec-vdd ✨ Virtual super display, upto 4K 2160p240hz &#x1f60e; 项目地址: https://gitcode.com/gh_mirrors/pa/parsec-vdd 在数字工作时代&#xff0c;屏幕空间已成为提升生产力…

作者头像 李华
网站建设 2026/1/15 3:29:18

Wallpaper Engine下载工具完整指南:快速获取创意壁纸的免费方案

Wallpaper Engine下载工具完整指南&#xff1a;快速获取创意壁纸的免费方案 【免费下载链接】Wallpaper_Engine 一个便捷的创意工坊下载器 项目地址: https://gitcode.com/gh_mirrors/wa/Wallpaper_Engine 厌倦了在Steam创意工坊中寻找精美壁纸的繁琐流程&#xff1f;这…

作者头像 李华
网站建设 2025/12/22 18:56:59

终极Windows驱动存储管理方案:DriverStore Explorer完全操作指南

终极Windows驱动存储管理方案&#xff1a;DriverStore Explorer完全操作指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer [RAPR] 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer DriverStore Explorer作为Windows系统驱动程序管理的…

作者头像 李华
网站建设 2025/12/22 18:56:56

RimWorld模组管理器终极指南:智能排序解决依赖冲突的完整方案

RimWorld模组管理器终极指南&#xff1a;智能排序解决依赖冲突的完整方案 【免费下载链接】RimSort 项目地址: https://gitcode.com/gh_mirrors/ri/RimSort 你是否曾经因为RimWorld模组加载顺序问题而烦恼&#xff1f;游戏启动时突然崩溃&#xff0c;却找不到问题根源&…

作者头像 李华
网站建设 2026/1/15 10:45:19

一文说清STM32在PCBA中的调试接口配置

STM32调试接口实战指南&#xff1a;从PCBA设计到量产的安全与效率平衡在嵌入式开发的世界里&#xff0c;一个看似不起眼的两针接口&#xff0c;往往决定了整块PCB板的命运——是顺利通过测试、快速投产&#xff0c;还是卡在烧录环节反复返工。这个关键角色&#xff0c;正是STM3…

作者头像 李华
网站建设 2026/1/9 17:38:18

OBS多平台推流终极指南:一键开启全网直播分发

OBS多平台推流终极指南&#xff1a;一键开启全网直播分发 【免费下载链接】obs-multi-rtmp OBS複数サイト同時配信プラグイン 项目地址: https://gitcode.com/gh_mirrors/ob/obs-multi-rtmp 想要一次直播覆盖多个平台&#xff0c;却苦于技术门槛&#xff1f;OBS多平台推…

作者头像 李华